using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Raster._RasterDataset
{
    /// <summary>
    /// <para>Create Random Raster</para>
    /// <para>Creates a raster dataset of random values with a distribution you define.</para>
    /// <para>使用您定义的分布创建随机值的栅格数据集。</para>
    /// </summary>    
    [DisplayName("Create Random Raster")]
    public class CreateRandomRaster : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public CreateRandomRaster()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_out_path">
        /// <para>Output Location</para>
        /// <para>The folder or geodatabase where the output raster dataset will be stored.</para>
        /// <para>将存储输出栅格数据集的文件夹或地理数据库。</para>
        /// </param>
        /// <param name="_out_name">
        /// <para>Raster Dataset Name with Extension</para>
        /// <para><xdoc>
        ///   <para>The name and format of the raster dataset you are creating.</para>
        ///   <para>To store the output as a raster dataset in a geodatabase, do not add a file extension to the raster dataset name.</para>
        ///   <para>For file-based rasters, use the appropriate extension to specify the format to create as follows:</para>
        ///   <bulletList>
        ///     <bullet_item>.tif—TIFF raster</bullet_item><para/>
        ///     <bullet_item>.img—ERDAS IMAGINE raster</bullet_item><para/>
        ///     <bullet_item>.crf—CRF raster</bullet_item><para/>
        ///     <bullet_item>No extension—Esri Grid</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要创建的栅格数据集的名称和格式。</para>
        ///   <para>要将输出作为栅格数据集存储在地理数据库中，请勿在栅格数据集名称中添加文件扩展名。</para>
        ///   <para>对于基于文件的栅格，请使用适当的扩展名指定要创建的格式，如下所示：</para>
        ///   <bulletList>
        ///     <bullet_item>.tif - TIFF 栅格</bullet_item><para/>
        ///     <bullet_item>.img—ERDAS IMAGINE 栅格</bullet_item><para/>
        ///     <bullet_item>.crf - CRF 栅格</bullet_item><para/>
        ///     <bullet_item>无扩展 - Esri Grid</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public CreateRandomRaster(object _out_path, object _out_name)
        {
            this._out_path = _out_path;
            this._out_name = _out_name;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Create Random Raster";

        public override string CallName => "management.CreateRandomRaster";

        public override List<string> AcceptEnvironments => ["extent", "outputCoordinateSystem", "pyramid"];

        public override object[] ParameterInfo => [_out_path, _out_name, _distribution, _raster_extent, _cellsize, _out_raster_dataset, _build_rat.GetGPValue()];

        /// <summary>
        /// <para>Output Location</para>
        /// <para>The folder or geodatabase where the output raster dataset will be stored.</para>
        /// <para>将存储输出栅格数据集的文件夹或地理数据库。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Location")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_path { get; set; }


        /// <summary>
        /// <para>Raster Dataset Name with Extension</para>
        /// <para><xdoc>
        ///   <para>The name and format of the raster dataset you are creating.</para>
        ///   <para>To store the output as a raster dataset in a geodatabase, do not add a file extension to the raster dataset name.</para>
        ///   <para>For file-based rasters, use the appropriate extension to specify the format to create as follows:</para>
        ///   <bulletList>
        ///     <bullet_item>.tif—TIFF raster</bullet_item><para/>
        ///     <bullet_item>.img—ERDAS IMAGINE raster</bullet_item><para/>
        ///     <bullet_item>.crf—CRF raster</bullet_item><para/>
        ///     <bullet_item>No extension—Esri Grid</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要创建的栅格数据集的名称和格式。</para>
        ///   <para>要将输出作为栅格数据集存储在地理数据库中，请勿在栅格数据集名称中添加文件扩展名。</para>
        ///   <para>对于基于文件的栅格，请使用适当的扩展名指定要创建的格式，如下所示：</para>
        ///   <bulletList>
        ///     <bullet_item>.tif - TIFF 栅格</bullet_item><para/>
        ///     <bullet_item>.img—ERDAS IMAGINE 栅格</bullet_item><para/>
        ///     <bullet_item>.crf - CRF 栅格</bullet_item><para/>
        ///     <bullet_item>无扩展 - Esri Grid</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Raster Dataset Name with Extension")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_name { get; set; }


        /// <summary>
        /// <para>Distribution</para>
        /// <para><xdoc>
        ///   <para>Specifies the random value distribution method to use.</para>
        ///   <para>Each type has one or two settings to control the distribution.</para>
        ///   <bulletList>
        ///     <bullet_item>Uniform—A uniform distribution with the defined range between the Minimum and Maximum values. The default values are 0.0 for Minimum and 1.0 for Maximum. This is the default.</bullet_item><para/>
        ///     <bullet_item>Integer—An integer distribution with the defined range between the Minimum and Maximum values. The default values are 1 for Minimum and 10 for Maximum.</bullet_item><para/>
        ///     <bullet_item>Normal—A normal distribution with defined Mean and Standard Deviation values. The default values are 0.0 for Mean and 1.0 for Standard Deviation.</bullet_item><para/>
        ///     <bullet_item>Exponential—An exponential distribution with a defined Mean value. The default value is 1.0.</bullet_item><para/>
        ///     <bullet_item>Poisson-—A Poisson distribution with a defined Mean value. The default value is 1.0.</bullet_item><para/>
        ///     <bullet_item>Gamma—A gamma distribution with defined Alpha and Beta values. The default values are 1.0 for Alpha and 1.0 for Beta.</bullet_item><para/>
        ///     <bullet_item>Binomial—A binomial distribution with defined N and Probability values. The default values are 10 for N and 0.5 for Probability.</bullet_item><para/>
        ///     <bullet_item>Geometric—A geometric distribution with a defined Probability value. The default value is 0.5.</bullet_item><para/>
        ///     <bullet_item>Negative Binomial—A Pascal distribution with defined r and Probability values. The default values are 10.0 for r and 0.5 for Probability.</bullet_item><para/>
        ///   </bulletList>
        ///   <para>To edit the default value, click the value in the table and type the new value.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要使用的随机值分布方法。</para>
        ///   <para>每种类型都有一个或两个设置来控制分布。</para>
        ///   <bulletList>
        ///     <bullet_item>均匀分布 - 在最小值和最大值之间定义范围的均匀分布。“最小值”的默认值为 0.0，“最大值”的默认值为 1.0。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>整数 - 在最小值和最大值之间定义范围的整数分布。默认值为 1 表示最小值，默认值为 10 表示最大值。</bullet_item><para/>
        ///     <bullet_item>正态分布 - 具有定义均值和标准差值的正态分布。“平均值”的默认值为 0.0，标准差的默认值为 1.0。</bullet_item><para/>
        ///     <bullet_item>指数 - 具有定义平均值的指数分布。默认值为 1.0。</bullet_item><para/>
        ///     <bullet_item>泊松 （Poisson） - 具有定义均值的泊松分布。默认值为 1.0。</bullet_item><para/>
        ///     <bullet_item>Gamma - 具有定义的 Alpha 和 Beta 值的 Gamma 分布。Alpha 的默认值为 1.0，Beta 的默认值为 1.0。</bullet_item><para/>
        ///     <bullet_item>二项式 - 定义了 N 和概率值的二项分布。N 的默认值为 10，概率的默认值为 0.5。</bullet_item><para/>
        ///     <bullet_item>几何 - 具有定义概率值的几何分布。默认值为 0.5。</bullet_item><para/>
        ///     <bullet_item>负二项式 - 具有定义的 r 和 Probability 值的 Pascal 分布。r 的默认值为 10.0，概率的默认值为 0.5。</bullet_item><para/>
        ///   </bulletList>
        ///   <para>若要编辑默认值，请单击表中的值并键入新值。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Distribution")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _distribution { get; set; } = null;


        /// <summary>
        /// <para>Output extent</para>
        /// <para><xdoc>
        ///   <para>The extent of the output raster dataset.</para>
        ///   <bulletList>
        ///     <bullet_item>Default—The extent will be based on the maximum extent of all participating inputs. This is the default.</bullet_item><para/>
        ///     <bullet_item>Current Display Extent—The extent is equal to the data frame or visible display. The option is not available when there is no active map.</bullet_item><para/>
        ///     <bullet_item>As Specified Below—The extent will be based on the minimum and maximum extent values specified.</bullet_item><para/>
        ///     <bullet_item>Browse—The extent will be based on an existing dataset.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出栅格数据集的范围。</para>
        ///   <bulletList>
        ///     <bullet_item>默认值 - 范围将基于所有参与输入的最大范围。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>当前显示范围 - 范围等于数据框或可见显示。当没有活动地图时，该选项不可用。</bullet_item><para/>
        ///     <bullet_item>如下所述 - 范围将基于指定的最小和最大范围值。</bullet_item><para/>
        ///     <bullet_item>浏览 - 范围将基于现有数据集。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output extent")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _raster_extent { get; set; } = null;


        /// <summary>
        /// <para>Cellsize</para>
        /// <para>The spatial resolution of the output raster dataset.</para>
        /// <para>输出栅格数据集的空间分辨率。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Cellsize")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _cellsize { get; set; } = null;


        /// <summary>
        /// <para>Output raster dataset</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output raster dataset")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_raster_dataset { get; set; }


        /// <summary>
        /// <para>Build raster attribute table</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the tool will unconditionally build a raster attribute table for the output raster in which the selected distribution results in an integer output raster.</para>
        ///   <para>This parameter has no effect if the output raster is floating point.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—A raster attribute table will be unconditionally built for integer output rasters. This is the default.</bullet_item><para/>
        ///     <bullet_item>Unchecked—A raster attribute table will not be built for integer output rasters if the number of unique values is greater than or equal to 65535. If the number of unique values is less than 65535, a raster attribute table will be built.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定工具是否无条件地为输出栅格构建栅格属性表，其中所选分布将生成整数输出栅格。</para>
        ///   <para>如果输出栅格为浮点，则此参数无效。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 - 将为整数输出栅格无条件构建栅格属性表。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>未选中 - 如果唯一值数大于或等于 65535，则不会为整数输出栅格构建栅格属性表。如果唯一值数小于 65535，则将构建栅格属性表。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Build raster attribute table")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _build_rat_value _build_rat { get; set; } = _build_rat_value._false;

        public enum _build_rat_value
        {
            /// <summary>
            /// <para>BUILD</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("BUILD")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>DO_NOT_BUILD</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("DO_NOT_BUILD")]
            [GPEnumValue("false")]
            _false,

        }

        public CreateRandomRaster SetEnv(object extent = null, object outputCoordinateSystem = null, object pyramid = null)
        {
            base.SetEnv(extent: extent, outputCoordinateSystem: outputCoordinateSystem, pyramid: pyramid);
            return this;
        }

    }

}